맨위로가기

작업 제어 언어

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

작업 제어 언어(JCL)는 IBM 메인프레임 운영 체제에서 사용되는 언어로, 컴퓨터 작업의 실행 방식을 제어한다. JCL은 도스(DOS) JCL과 OS JCL로 나뉘며, 데이터 세트, 멤버, 분할 데이터 세트, USS(Unix System Services)와 같은 메인프레임 기술과 관련된 용어를 사용한다. 잡, 스텝, 프로시저를 통해 작업의 단위를 정의하며, JOB 카드로 잡을 식별하고, EXEC 카드로 프로그램을 실행하며, DD 카드로 데이터 세트를 정의한다. JCL은 80열 천공 카드를 기반으로 하며, 문법은 대문자를 사용하고, 슬래시(//)로 시작하는 문법을 따른다. 인스트림 입력을 지원하며, 프로그램 실행 관련 세부 사항을 명시적으로 지정해야 하는 복잡성을 지닌다. 또한, MVS 계열 JCL, VSE 계열 JCS, 작업 엔트리 제어 언어(JECL) 등이 존재하며, 각기 다른 구문과 기능을 가지고 있다.

더 읽어볼만한 페이지

  • 스크립트 언어 - Tcl
    Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다.
  • 스크립트 언어 - PHP
    PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
작업 제어 언어
기본 정보
유형명령어
개발자IBM
첫 출시1960년대
설계 대상IBM 메인프레임 운영 체제
파일 확장자.jcl
역사
개발 배경IBM 메인프레임 시스템에서 작업 실행 및 관리를 위해 개발됨
주요 목적작업 정의
데이터 세트 할당
프로그램 실행 순서 제어
기능
작업 정의JOB 문을 사용하여 작업 이름, 계정 정보, 우선순위 등을 정의
데이터 세트 관리DD 문을 사용하여 데이터 세트 할당, 속성 정의, 입출력 지정
프로그램 실행EXEC 문을 사용하여 프로그램 실행 및 매개변수 전달
제어문조건부 처리, 반복문 등을 사용하여 작업 흐름 제어
프로시저자주 사용되는 JCL 코드 블록을 프로시저로 정의하여 재사용성 향상
JCL 문 종류
JOB 문작업 시작을 알리고 작업 이름, 계정 정보, 우선순위 등을 정의
EXEC 문실행할 프로그램 또는 프로시저를 지정하고 매개변수를 전달
DD 문데이터 세트를 정의하고 할당하며, 입출력 속성을 지정
PROC 문프로시저 정의 시작을 알리고 프로시저 이름 및 매개변수를 정의
PEND 문프로시저 정의 종료를 알림
SET 문변수를 정의하고 값을 할당
IF/THEN/ELSE 문조건부 처리를 수행
DO/ENDDO 문코드 블록을 반복 실행
GOTO 문지정된 레이블로 이동
INCLUDE 문외부 JCL 파일을 현재 JCL에 포함
OUTPUT 문SYSOUT 데이터 세트의 출력 형식을 지정
JCLLIB 문프로시저 라이브러리를 지정
JCL 예시
작업 시작//JOB001 JOB (ACCT),CLASS=A
프로그램 실행//STEP1 EXEC PGM=MYPROG
데이터 세트 할당//INPUT DD DSN=MY.INPUT.DATA,DISP=SHR
SYSOUT 데이터 세트//REPORT DD SYSOUT=A
장점
자동화작업 스케줄링 및 자동 실행을 통해 운영 효율성 향상
일괄 처리대량의 데이터를 효율적으로 처리
자원 관리시스템 자원 할당 및 관리 용이
안정성검증된 안정적인 시스템 운영 환경 제공
단점
복잡성문법이 복잡하고 학습 곡선이 높음
유지보수JCL 코드 유지보수가 어려울 수 있음
의존성특정 하드웨어 및 운영 체제에 의존적
참고 자료
관련 기술IBM 메인프레임
z/OS
TSO/E
ISPF
관련 프로그래밍 언어COBOL
PL/I
어셈블리어
추가 설명
중요성메인프레임 환경에서 작업 자동화 및 관리에 필수적인 기술
현대적 대안클라우드 컴퓨팅 및 분산 시스템 환경에서는 다른 자동화 도구 및 기술이 사용됨

2. 도스 및 OS JCL에 공통적으로 쓰이는 기능

DOS/360OS/360이 처음 사용되었을 때 컴퓨터 시스템에 새로운 입력을 제공하는 주요 방법은 80열 천공 카드였기 때문에, 도스와 OS JCL은 모두 최대 80자 길이의 라인을 사용할 수 있었다.[10] 이후 디스크나 테이프 파일을 통해 더 긴 레코드 길이로 작업을 제출하는 것이 가능해졌지만, 운영 체제의 작업 제출 구성 요소는 80자 이후의 모든 것을 무시했다.

엄밀히 말하면, 두 운영 체제 제품군은 라인당 71자만 사용한다. 73~80자는 일반적으로 시스템이 작업 종료 보고서에 인쇄하고 운영 체제에서 보고된 오류의 위치를 식별하는 데 유용한 카드 시퀀스 번호이다. 72자는 일반적으로 비워두지만, JCL 문이 다음 카드에서 계속됨을 나타내기 위해 공백이 아닌 문자를 포함할 수 있다.

USS 파일 이름을 제외한 모든 명령, 매개변수 이름 및 값은 대문자로 입력해야 한다.

내부 스트림 입력을 제외한 모든 라인은 슬래시 "/"로 시작해야 하며, 운영 체제가 처리하는 모든 라인은 두 개의 슬래시 //로 시작해야 한다. - 항상 ''첫 번째 열''에서 시작한다. 그러나 구분 기호 문과 주석 문, 두 가지 예외가 있다. 구분 기호 문은 슬래시와 별표(/*)로 시작하고, OS JCL의 주석 문은 두 개의 슬래시와 별표(//*) 또는 DOS JCL의 별표로 시작한다.

많은 JCL 문은 71자 내에 맞추기에 너무 길지만, 다음과 같은 방법으로 무한정의 연속 카드로 확장할 수 있다.

OS JCLDOS JCL
구문에서 쉼표(,)가 필요한 지점에서 마지막을 제외한 모든 실제 JCL 카드를 종료구문에서 쉼표(,)와 열 72에 공백이 아닌 문자가 필요한 지점에서 마지막을 제외한 모든 실제 JCL 카드를 종료
각 연속 카드를 열 1의 //로 시작한 다음 최소 1개의 공백각 연속 카드를 공백으로 시작하고 열 15에서 계속



가장 일반적인 유형의 카드 구조는 다음과 같다.[11]

OS JCLDOS JCL
|



JCL 파일은 길고 복잡할 수 있으며, 언어 자체도 읽기 쉽지 않다. OS JCL은 프로그래머가 두 가지 유형의 설명을 포함할 수 있도록 허용한다.


  • JCL 문장과 같은 줄에 표시된다. 열 72에 연속 문자(일반적으로 "X")를 넣고 다음 줄의 열 1-3에 "// "을 입력하여 확장할 수 있다.
  • 주석만 포함하는 줄은 지역 세부 사항보다는 JCL의 전체적인 구조에 대한 주요 사항을 설명하는 데 자주 사용된다. 주석만 있는 줄은 길고 복잡한 JCL 파일을 섹션으로 나누는 데에도 사용된다.


```jcl

//MYJOB JOB ..........

//* 주석만 포함하는 줄입니다.

// JCL 목록을 섹션으로 나누는 데 자주 사용됩니다 //STEP01 EXEC MYPROC 문장과 같은 줄의 주석 2

//STEP02 EXEC PGM=......... 주석 3이 확장되어 X

// 다른 줄로 넘칩니다.

//INPUT01 DD DSN=STEP01.MYPR01.NEWFILE

```

JCL 스테이트먼트의 한 줄 길이는 80 바이트이며, 한 줄 이상의 스테이트먼트로 하나의 JCL이 구성된다. JCL 스테이트먼트는 1열부터 71열까지 사용한다(주석 제외). 73열부터 80열에는 종종 시퀀스 번호가 기록된다. 71자를 초과하여 하나의 스테이트먼트를 기술하는 경우에는(주석 제외), 앞 줄의 마지막은 쉼표로 끝나며, 다음 줄은 4열부터 16열 사이에서 시작한다(모든 줄의 처음 2 문자는 "//"이다).

JCL은 1열부터 2열의 "//"로 시작한다. "/*" 또는 사용자 정의 다른 구분자, "//*"는 해당 행 전체가 주석임을 나타내는 예외가 있다.

이름 필드는 하나의 명령문이므로, 다른 명령문이 해당 명령문을 지시하거나 언급할 수 있다. 3번째 열부터 시작하며, 8자 이하여야 한다. 알파벳과 숫자, "#"나 "@" 또는 "$"와 같은 문자를 사용할 수 있다. 이름의 시작은 숫자로 시작할 수 없다. 작업명, 단계명, 프로시저명, DD명을 기술한다.

오퍼레이션 필드는 실행해야 할 명령, 오퍼레이션("JOB", "EXEC", "DD" 등)을 기술한다. 최소한 1개의 공백이 앞에 와야 한다.

키워드 매개변수의 순서는 정해져 있지 않다. 매개변수와 매개변수 사이에는 공백을 두지 않는다. 공백 다음에는 주석이 온다. 행 내 매개변수 기술의 왼쪽, 매개변수 앞에는 가독성을 높이기 위한 공백이 들어간다. JCL의 명령문 파라미터 필드 뒤에 인라인 코멘트를 기술할 경우에는, 최소 1자의 공백을 두어 명령문과 코멘트를 구분한다. 71번째 열을 초과하여 코멘트를 기술할 경우에는, 72번째 열을 공백으로 두지 않는다(통상, "X"가 사용된다). 다음 행은 "// " 뒤 1번째 열에서 3번째 열 사이부터 코멘트의 기술을 계속한다.

도스 JCL과 OS JCL은 모두 인스트림 입력을 지원하는데, 이는 운영 체제가 아닌 응용 프로그램이 처리할 "카드"를 의미한다. 오랫동안 보관해야 할 데이터는 일반적으로 디스크에 저장되지만, 대화형 터미널의 사용이 보편화되기 전에는 이러한 디스크 파일을 생성하고 편집하는 유일한 방법은 카드에 새 데이터를 제공하는 것이었다.[12]

도스 JCL과 OS JCL은 인스트림 입력의 시작을 알리는 방식이 다르지만, 마지막 인스트림 데이터 카드 다음 카드의 1열에 /*로 인스트림 입력을 종료한다는 공통점이 있다. 이렇게 하면 운영 체제가 /* 카드 다음 카드에서 JCL 처리를 재개한다.[12]

  • OS JCL: DD 문은 데이터 세트뿐만 아니라 인스트림 데이터를 설명하는 데 사용될 수 있다. 인스트림 데이터를 처리하는 DD 문은 DD 식별자 뒤에 별표(*)가 붙는다. (예: //SYSIN DD *) DD DATA 문을 사용하여 JCL 문을 인스트림 데이터의 일부로 포함할 수 있다.


:'''DLM'''이라는 피연산자를 사용하면 구분 기호를 지정할 수 있다(기본값은 "/*"). 대체 구분 기호를 지정하면 JCL을 데이터로 읽을 수 있다. 예를 들어, 프로시저를 라이브러리 멤버로 복사하거나 작업을 "내부 리더"에 제출할 수 있다.[13]

  • 도스 JCL: 프로그램에 대한 EXEC 카드 뒤에 인스트림 데이터를 입력하기만 하면 된다.

2. 1. 잡, 스텝, 프로시저

도스 JCL과 OS JCL에서 일의 단위는 잡(job)이다. 하나의 잡은 하나 이상의 스텝(step)으로 구성되며, 각 스텝은 특정 프로그램을 실행하기 위한 요청이다.[9]

예를 들어 관계형 데이터베이스 시대 이전에, 관리를 위한 인쇄물 형태의 보고서를 만들어내는 잡은 다음의 스텝들을 포함할 수 있었다.

  • 적절한 레코드들을 선택하고 이들을 임시 파일로 복사하기 위해 사용자가 작성한 프로그램
  • 보통 일반 목적의 유틸리티를 이용하여 임시 파일을 필요한 순서에 따라 정렬
  • 부분합과 같은 기타 유용한 정보를 포함하고 있는 프로그램으로서 최종 사용자가 읽기 쉽게끔 정보를 표현하기 위해 사용자가 작성한 프로그램
  • 모니터나 터미널에 보여줄 최종 사용자 정보의 선택된 페이지들에 서식을 입히기 위해 사용자가 작성한 프로그램


도스 JCL과 OS JCL 모두 최초의 카드(card)는 JOB 카드여야 하며, 다음을 수행한다.[9]

  • 잡을 식별한다.
  • 일반적으로 컴퓨터 서비스 부서가 적절한 사용자 부서에 계산서를 보낼 수 있도록 정보를 제공한다.
  • 잡 전반을 어떻게 실행할 것인지를 정의한다. (예: 다른 잡에 상대적인 잡의 우선 순위)


프로시저(proc)는 잡에 삽입된, 스텝 및 스텝 그룹에 대해 미리 작성된 JCL이다. 도스 JCL과 OS JCL 모두 이러한 프로시저를 사용할 수 있다. 프로시저는 하나의 잡이나 각기 다른 잡에서 여러 번 사용되는 스텝을 되풀이하는데 쓰인다. 이를 통해 프로그래머의 시간을 절약하고 오류의 위험도를 낮출 수 있다. 프로시저를 실행하기 위해 JCL 파일에 하나의 카드를 포함할 수 있는데, 이 카드는 프로시저를 특정한 파일로부터 복사한 뒤 이를 작업 흐름에 삽입한다. 또한, 프로시저는 매개변수(parameter)를 포함하여 개별 이용에 맞게 프로시저를 맞춤식으로 정의할 수 있다.

'''프로시저'''는 하나 이상의 "''EXEC PGM=''" 및 ''DD'' 문을 그룹화한 다음 "''EXEC PROC=''procname" 또는 간단히 "EXEC procname"으로 호출할 수 있도록 한다.[26]

프로시저 라이브러리라는 기능을 통해 프로시저를 미리 저장할 수 있었다.

MVS의 구 버전에서는 프로시저가 SYS1.PROCLIB에 미리 저장/카탈로그되어 있어야 했다(카탈로그식 프로시저, 카타프로). 새 버전에서는 사용자가 정의한 라이브러리에 저장된 프로시저도 사용할 수 있게 되었다.

일반적으로 프로시저는 proclib라고 불리는 프로시저 라이브러리에서 호출되어 실행된다. 한편, 실행하는 해당 잡 자체 내에 정의할 수도 있다. 이는 인라인(in-stream) 프로시저라고 불리며, 보통 proclib에 등록하기 전에 프로시저를 테스트할 때 사용된다.

첫 번째 행은 반드시 PROC 스테이트먼트로 시작한다. 여기에는 프로시저 이름과 심볼릭의 초기값을 정의한다. 예:

//MYPROC PROC &LIB="MY.TEST.LIBRARY"

어떤 잡이 이 프로시저를 호출할 때, 예를 들어 다음과 같이 기술한다:

//FIRST EXEC MYPROC

//SECOND EXEC MYPROC,LIB="FREDS.TEST.LIBRARY"

FIRST의 예에서는 MYPROC 프로시저 중의 심볼 LIB는 초기값 "MY.TEST.LIBRARY"로 치환된다. SECOND의 예에서는 MYPROC 프로시저 중의 심볼 LIB는 호출 시 지정한 "FREDS.TEST.LIBRARY"로 치환된다.

인라인 프로시저를 종료하는 스테이트먼트는:

// PEND

2. 2. 기본 문법

도스OS JCL은 모두 최대 80자 길이의 라인을 사용할 수 있는데, 이는 DOS/360, OS/360이 처음 사용되었을 때 컴퓨터 시스템에 새로운 입력을 제공하는 주요 방법이 80열 천공 카드였기 때문이다.[10] 나중에 디스크 또는 테이프 파일을 통해 더 긴 레코드 길이로 작업을 제출하는 것이 가능해졌지만, 운영 체제의 작업 제출 구성 요소는 80자 이후의 모든 것을 무시했다.

엄밀히 말하면, 두 운영 체제 제품군은 라인당 71자만 사용한다. 73~80자는 일반적으로 시스템이 작업 종료 보고서에 인쇄하고 운영 체제에서 보고된 오류의 위치를 식별하는 데 유용한 카드 시퀀스 번호이다. 72자는 일반적으로 비워두지만, JCL 문이 다음 카드에서 계속됨을 나타내기 위해 공백이 아닌 문자를 포함할 수 있다.

USS 파일 이름을 제외하고 모든 명령, 매개변수 이름 및 값은 대문자로 입력해야 한다.

내부 스트림 입력을 제외한 모든 라인은 슬래시 "/"로 시작해야 하며, 운영 체제가 처리하는 모든 라인은 두 개의 슬래시 //로 시작해야 한다. - 항상 ''첫 번째 열''에서 시작한다. 그러나 두 가지 예외가 있다. 구분 기호 문과 주석 문이다. 구분 기호 문은 슬래시와 별표(/*)로 시작하고, OS JCL의 주석 문은 두 개의 슬래시와 별표(//*) 또는 DOS JCL의 별표로 시작한다.

많은 JCL 문은 71자 내에 맞추기에 너무 길지만 다음과 같은 방법으로 무한정의 연속 카드로 확장할 수 있다.

OS JCLDOS JCL
구문에서 쉼표(,)가 필요한 지점에서 마지막을 제외한 모든 실제 JCL 카드를 종료구문에서 쉼표(,)와 열 72에 공백이 아닌 문자가 필요한 지점에서 마지막을 제외한 모든 실제 JCL 카드를 종료
각 연속 카드를 열 1의 //로 시작한 다음 최소 1개의 공백각 연속 카드를 공백으로 시작하고 열 15에서 계속



가장 일반적인 유형의 카드의 구조는 다음과 같다.[11]

OS JCLDOS JCL
|



JCL 파일은 길고 복잡할 수 있으며, 언어 자체도 읽기 쉽지 않다. OS JCL은 프로그래머가 두 가지 유형의 설명을 포함할 수 있도록 허용한다.


  • JCL 문장과 같은 줄에 표시된다. 열 72에 연속 문자(일반적으로 "X")를 넣고 다음 줄의 열 1-3에 "// "을 입력하여 확장할 수 있다.
  • 주석만 포함하는 줄은 지역 세부 사항보다는 JCL의 전체적인 구조에 대한 주요 사항을 설명하는 데 자주 사용된다. 주석만 있는 줄은 길고 복잡한 JCL 파일을 섹션으로 나누는 데에도 사용된다.


```jcl

//MYJOB JOB ..........

//* 주석만 포함하는 줄입니다.

// JCL 목록을 섹션으로 나누는 데 자주 사용됩니다 //STEP01 EXEC MYPROC 문장과 같은 줄의 주석 2

//STEP02 EXEC PGM=......... 주석 3이 확장되어 X

// 다른 줄로 넘칩니다.

//INPUT01 DD DSN=STEP01.MYPR01.NEWFILE

```

JCL 스테이트먼트의 한 줄 길이는 80 바이트이며, 한 줄 이상의 스테이트먼트로 하나의 JCL이 구성된다.

JCL 스테이트먼트는 1열부터 71열까지 사용한다(주석 제외). 73열부터 80열에는 종종 시퀀스 번호가 기록된다.

71자를 초과하여 하나의 스테이트먼트를 기술하는 경우에는(주석 제외), 앞 줄의 마지막은 쉼표로 끝나며, 다음 줄은 4열부터 16열 사이에서 시작한다(물론, 모든 줄의 처음 2 문자는 "//"이다).

JCL은 1열부터 2열의 "//"로 시작한다. 다음은 예외이다.

  • "/*" 또는 사용자 정의 다른 구분자
  • "//*"는 해당 행 전체가 주석임을 나타낸다.


이름 필드는 하나의 명령문이다. 따라서 다른 명령문이 해당 명령문을 지시하거나 언급할 수 있다. 3번째 열부터 시작하며, 8자 이하여야 한다. 알파벳과 숫자, "#"나 "@" 또는 "$"와 같은 문자를 사용할 수 있다. 이름의 시작은 숫자로 시작할 수 없다. 작업명, 단계명, 프로시저명, DD명을 기술한다.

오퍼레이션 필드는 실행해야 할 명령, 오퍼레이션("JOB", "EXEC", "DD" 등)을 기술한다. 최소한 1개의 공백이 앞에 와야 한다.

키워드 매개변수의 순서는 정해져 있지 않다. 매개변수와 매개변수 사이에는 공백을 두지 않는다. 공백 다음에는 주석이 온다. 행 내 매개변수 기술의 왼쪽, 매개변수 앞에는 가독성을 높이기 위한 공백이 들어간다.

JCL의 명령문 파라미터 필드 뒤에 인라인 코멘트를 기술할 경우에는, 최소 1자의 공백을 두어 명령문과 코멘트를 구분한다. 71번째 열을 초과하여 코멘트를 기술할 경우에는, 72번째 열을 공백으로 두지 않는다(통상, "X"가 사용된다). 다음 행은 "// " 뒤 1번째 열에서 3번째 열 사이부터 코멘트의 기술을 계속한다.

2. 3. 인스트림 입력

도스 JCL과 OS JCL은 모두 인스트림 입력을 지원하는데, 이는 운영 체제가 아닌 응용 프로그램이 처리할 "카드"를 의미한다. 오랫동안 보관해야 할 데이터는 일반적으로 디스크에 저장되지만, 대화형 터미널의 사용이 보편화되기 전에는 이러한 디스크 파일을 생성하고 편집하는 유일한 방법은 카드에 새 데이터를 제공하는 것이었다.[12]

도스 JCL과 OS JCL은 인스트림 입력의 시작을 알리는 방식이 다르지만, 마지막 인스트림 데이터 카드 다음 카드의 1열에 /*로 인스트림 입력을 종료한다는 공통점이 있다. 이렇게 하면 운영 체제가 /* 카드 다음 카드에서 JCL 처리를 재개한다.[12]

  • OS JCL: DD 문은 데이터 세트뿐만 아니라 인스트림 데이터를 설명하는 데 사용될 수 있다. 인스트림 데이터를 처리하는 DD 문은 DD 식별자 뒤에 별표(*)가 붙는다. (예: //SYSIN DD *) DD DATA 문을 사용하여 JCL 문을 인스트림 데이터의 일부로 포함할 수 있다.


:'''DLM'''이라는 피연산자를 사용하면 구분 기호를 지정할 수 있다(기본값은 "/*"). 대체 구분 기호를 지정하면 JCL을 데이터로 읽을 수 있다. 예를 들어, 프로시저를 라이브러리 멤버로 복사하거나 작업을 "내부 리더"에 제출할 수 있다.[13]

  • 도스 JCL: 프로그램에 대한 EXEC 카드 뒤에 인스트림 데이터를 입력하기만 하면 된다.

2. 4. 복잡한 특징들

JCL이 복잡한 이유는 주로 시스템/360 환경의 특성 때문이었다.[41] JCL은 일괄 처리를 위해 설계되었기 때문에 프로그램 실행과 관련된 모든 세부 사항을 명시적으로 지정해야 했다.[16] 예를 들어, `DISP=(NEW,CATLG,DELETE)`와 같이 파일 처리 방식을 상세히 지정해야 했다.[16]

시스템/360 머신은 여러 사용자가 공유하도록 설계되었기 때문에, JOB 카드에는 사용자 계정, 우선 순위 등을 지정해야 했다.[16] 또한, `//SYSPRINT DD SYSOUT=*`와 같이 출력 장치를 지정하는 것도 JCL의 역할이었다.[16]

초기 메인프레임 시스템은 일괄 처리를 지향했기 때문에, JCL은 작업 실행 전에 필요한 모든 리소스를 확보하도록 설계되었다.[8] 이는 교착 상태를 방지하는 데 도움이 되었다.[8]

OS JCL의 복잡성은 데이터 세트 정보를 지정하기 위한 많은 옵션에서 비롯된다.[34] 유닉스와 유사한 운영 체제에서는 파일이 정렬된 바이트 스트림으로 추상화되어 있지만, OS/360 및 후속 버전의 데이터 세트는 파일 유형과 크기, 레코드 유형과 길이, 블록 크기, 자기 테이프 밀도와 같은 장치별 정보 및 레이블 정보를 노출한다.[34]

JCL의 복잡성에 대한 또 다른 설명은 PC 또는 유닉스와 유사한 환경에서 작업 실행에 대한 기대치가 다르다는 것이다.[15]

  • 저가형 System/360 CPU는 1980년대 중반의 PC보다 성능이 떨어지고 가격이 비쌌다.[15]
  • JCL은 일괄 처리를 위해 설계되었기 때문에 운영 체제에 각 단계의 결과에 따라 수행할 작업을 포함하여 모든 것을 알려야 했다.[16]
  • System/360 머신은 조직의 모든 사용자가 공유하도록 설계되었기 때문에, JOB 카드는 운영 체제에 사용자의 계정에 청구하는 방법, 할당될 수 있는 미리 정의된 스토리지 및 기타 리소스의 양 등을 알려준다.[16]


OS JCL은 복잡하고[34], "사용자에게 적대적"이라고 묘사되기도 했다.[30][31] JCL에 관한 한 교재에서는 "왜 정교한 프로그래머들조차 작업 제어 언어(Job Control Language)에 관해서 망설이게 될까?"라고 질문했다.[32] 많은 프로그래머들이 JCL을 이해하지 못하고 복사하거나 다른 사람에게 맡기는 경우가 많았다.[32]

프레드 브룩스는 JCL이 생성된 OS/360 프로젝트를 감독했으며, JCL을 "최악의 컴퓨터 프로그래밍 언어"라고 불렀다.[14] 그는 JCL 디자이너들이 JCL이 실제로 프로그래밍 언어라는 것을 깨닫지 못했다고 지적했다.[14]

3. 도스 JCL

도스 JCL은 IBM 도스/360 및 그 후속 운영 체제에서 사용되는 작업 제어 언어다. 도스 JCL과 OS JCL에서 일의 단위는 잡(job)이며, 하나의 잡은 하나 이상의 스텝(step)으로 이루어진다. 각 스텝은 하나의 특정 프로그램을 실행하기 위한 요청이다.

예를 들어, 관계형 데이터베이스 시대 이전에 관리용 인쇄 보고서를 만드는 잡은 다음과 같은 스텝들로 구성될 수 있다:


  • 사용자가 작성한 프로그램: 적절한 레코드를 선택하여 임시 파일로 복사한다.
  • 일반 목적의 유틸리티: 임시 파일을 필요한 순서대로 정렬한다.
  • 사용자가 작성한 프로그램: 부분합 등 유용한 정보를 포함하고 최종 사용자가 읽기 쉽도록 정보를 표현한다.
  • 사용자가 작성한 프로그램: 모니터나 터미널에 보여줄 최종 사용자 정보의 선택된 페이지들에 서식을 입힌다.


도스 JCL과 OS JCL 모두 최초의 카드(card)는 JOB 카드여야 한다. 이 카드는 잡을 식별하고, 컴퓨터 서비스 부서가 적절한 사용자 부서에 계산서를 보낼 수 있도록 정보를 제공하며, 잡 전반을 어떻게 실행할 것인지(예: 다른 잡에 상대적인 잡의 우선 순위)를 정의한다.

프로시저(proc)는 잡에 삽입된, 스텝 및 스텝 그룹에 대해 미리 작성된 JCL이다. 도스 JCL과 OS JCL 둘 다 이러한 프로시저를 사용할 수 있다. 프로시저는 하나의 잡이나 각기 다른 잡에서 여러 번 사용되는 스텝을 되풀이하는데 쓰여 프로그래머의 시간을 절약하고 오류의 위험도를 낮춘다. 프로시저를 실행하기 위해 JCL 파일에 하나의 카드를 포함할 수 있는데, 이 카드는 프로시저를 특정한 파일로부터 복사한 뒤 이를 작업 흐름에 삽입한다. 또, 프로시저는 매개변수(parameter)를 포함하여 개별 이용에 맞게 프로시저를 맞춤식으로 정의할 수 있다.

3. 1. 위치 매개변수

도스 JCL에서 매개변수들은 위치에 따라 의미가 결정되므로, 순서를 엄격하게 지켜야 한다. 프로그래머는 어느 항목이 어느 위치로, 어떠한 종류의 문으로 이동하는지 기억해야 한다. 일부 선택적 매개변수들을 누락시킨 뒤 나중에 포함되면, 누락된 매개변수들은 공란이 없는 쉼표로 표현해 주어야 한다.

OS JCL보다 매개변수가 적지만 더 많은 문들을 사용함으로써 도스 JCL은 어느 정도는 위치 매개변수의 난이도를 완화시킨다. ASSGN, DLBL, EXTENT 문들은 OS JCL의 하나의 DD 문과 동일한 일을 한다.

3. 2. 장치 의존성

초기 DOS/360과 대부분의 DOS/VS 버전에서는 작업을 마칠 때 삭제될 기존의 파일과 임시 파일에 대해서도 개별 디스크나 테이프 파일에 사용될 장치의 모델 번호를 지정해야 했다.[1] 이는 고객이 더 현대적인 형태의 장치로 업그레이드하면 수많은 JCL 파일을 변경해야 함을 뜻했다.[1]

이후 DOS/360 계열이 등장함에 따라 모델 번호를 요구하는 일이 줄었다.[1]

4. OS JCL

OS JCL은 IBM OS/360 및 그 후속 운영 체제 (MVS, z/OS 등)에서 사용되는 작업 제어 언어이다.

OS JCL에서 일의 단위는 잡(job)이며, 하나의 잡은 하나 이상의 스텝(step)으로 구성된다. 각 스텝은 특정 프로그램 실행을 요청한다. 예를 들어, 관계형 데이터베이스 이전 시대에는 관리용 보고서를 생성하는 잡이 다음과 같은 스텝들로 구성될 수 있었다.


  • 특정 레코드를 선택하여 임시 파일로 복사하는 사용자 작성 프로그램
  • 임시 파일을 정렬하는 유틸리티 (일반적으로 사용됨)
  • 부분합 등 추가 정보를 포함하여 최종 사용자가 읽기 쉬운 형태로 정보를 표현하는 사용자 작성 프로그램
  • 모니터나 터미널에 표시할 최종 사용자 정보의 선택된 페이지에 서식을 지정하는 사용자 작성 프로그램


도스 JCL과 OS JCL 모두 첫 번째 카드는 JOB 카드여야 한다. 이 카드는 잡을 식별하고, 컴퓨터 서비스 부서가 사용자 부서에 계산서를 보낼 수 있도록 정보를 제공하며, 잡 실행 방식을 정의한다(예: 다른 잡에 대한 상대적 우선 순위).

프로시저(proc)는 잡에 삽입되는 미리 작성된 JCL 스텝 및 스텝 그룹이다. 도스 JCL과 OS JCL 모두 프로시저를 사용할 수 있다. 프로시저는 여러 번 사용되는 스텝을 반복하는 데 사용되어 프로그래머의 시간을 절약하고 오류 위험을 줄인다. 프로시저 실행을 위해 JCL 파일에 하나의 카드를 포함할 수 있으며, 이 카드는 프로시저를 특정 파일에서 복사하여 작업 흐름에 삽입한다. 프로시저는 매개변수(parameter)를 포함하여 개별 이용에 맞게 맞춤식으로 정의할 수 있다.

JCL 문은 다음과 같이 세 가지 기본 문으로 구성된다.[19]

  • '''JOB 문:''' 잡의 시작을 식별하고, 청구, 실행 우선 순위, 시간 및 공간 제한과 같은 전체 잡에 대한 정보를 제공한다.
  • '''EXEC 문:''' 잡의 현재 스텝에서 실행될 프로그램 및 스텝에 대한 정보를 식별한다.
  • '''DD (Data Description) 문:''' 스텝에 사용되는 데이터 파일과 해당 파일에 대한 자세한 정보를 식별한다. DD 문은 스텝 내 어느 순서에라도 올 수 있다.


초기부터 OS 계열의 JCL (최대 z/OS 포함)은 유연하고 사용하기 쉬워졌다.

다음 예는 1964년 시스템/360이 등장하자마자 제공되는 오래된 스타일의 문법을 사용한다. 이 오래된 문법은 20년 넘도록 여전히 동일하며 약간의 변경 사항만 있을 뿐이다.

JCL과 함께 사용되는 특정 단어는 IBM 메인프레임 기술과 관련이 있다.

  • '''데이터 세트(Data Set):''' 파일. 임시 또는 영구적일 수 있으며 디스크 드라이브, 테이프 스토리지 등에 위치할 수 있다.[4][5]
  • '''멤버(Member):''' 분할 데이터 세트(PDS) 내의 개별 데이터 세트. 괄호 안에 멤버 이름을 사용하여 PDS 이름을 지정하여 멤버에 접근할 수 있다. (예: SYS1.MACLIB(GETMAIN)).[6]
  • '''분할 데이터 세트(Partitioned Data Set, PDS):''' 멤버 또는 아카이브의 모음. 텍스트 데이터(소스 코드, 어셈블러 매크로(SYS1.MACLIB), 시스템 구성(SYS1.PARMLIB), 재사용 가능한 JCL 프로시저(SYS1.PROCLIB) 등)를 저장하는 데 주로 사용된다. 아카이브 파일(ZIP, TAR 등) 및 다른 운영 체제의 디렉토리와 유사하다. 바이너리 코드(로드 모듈 또는 프로그램 객체) 저장에도 사용된다. IEBUPDTE 유틸리티를 사용하여 멤버를 삭제하고 대체해야 한다.[6] 1989년 MVS DFP 3.2 이후 PDSE(Partitioned Data Set Extended)는 PDS의 개선된 버전으로 존재한다.[7]
  • '''USS (Unix System Services):''' MVS 기본 제어 프로그램의 일부로 실행되는 완전한 유닉스 환경. 가상화 없이 POSIX를 완벽하게 준수하는 유닉스 환경에서 메인프레임에서 유닉스 파일, 스크립트, 작업 및 프로그램을 실행할 수 있도록 한다.


초기 메인프레임 시스템은 일괄 처리를 지향했다. 많은 일괄 작업은 주 기억 장치, 자기 테이프, 전용 디스크 볼륨, 특수 양식을 갖춘 프린터 등 설정이 필요했다.[8] JCL은 작업 실행 전에 필요한 모든 리소스를 사용할 수 있도록 하기 위해 개발되었다. 예를 들어, 리눅스와 같은 시스템에서는 필요한 데이터 세트를 명령줄에서 지정할 수 있으며, 셸에 의해 대체되거나 런타임에 프로그램에 의해 생성될 수 있다. 이러한 시스템에서 운영 체제 작업 스케줄러는 작업의 요구 사항을 거의 알지 못한다. 반대로 JCL은 필요한 모든 데이터 세트와 장치를 명시적으로 지정한다. 스케줄러는 작업을 실행하기 전에 리소스를 사전 할당할 수 있다. 이는 작업 A가 리소스 R1을 보유하고 R2를 요청하는 동시에 작업 B가 R2를 보유하고 R1을 요청하는 "교착 상태"를 방지하는 데 도움이 된다.

프레드 브룩스는 JCL이 생성된 OS/360 프로젝트를 감독했으며, 디자인의 설계에서 JCL을 "최악의 컴퓨터 프로그래밍 언어"라고 불렀다.[14] 그는 JCL 디자이너들이 JCL이 프로그래밍 언어라는 것을 깨닫지 못했다고 지적했다.

OS JCL의 복잡성은 데이터 세트 정보를 지정하기 위한 많은 옵션에서 비롯된다. 유닉스와 유사한 운영 체제에서 파일은 정렬된 바이트 스트림으로 추상화되어 구조화된 데이터를 읽고 쓰는 작업은 사용자 수준 프로그램에 전적으로 속하며, 데이터 저장 및 액세스의 실제 세부 사항은 사용자 프로그램의 지식 없이 운영 체제에서 대부분 처리된다. 반면 OS/360 및 후속 버전의 데이터 세트는 파일 유형과 크기, 레코드 유형과 길이, 블록 크기, 자기 테이프 밀도와 같은 장치별 정보 및 레이블 정보를 노출한다. 많은 옵션에 대한 시스템 기본값이 있지만 프로그래머는 JCL과 프로그램에 코딩된 정보의 조합을 통해 많은 것을 지정해야 한다. 프로그램에 더 많은 정보가 코딩될수록 유연성은 줄어든다. 프로그램의 정보가 JCL의 모든 것을 무시하기 때문이다. 따라서 대부분의 정보는 일반적으로 JCL을 통해 제공된다.

예를 들어, 유닉스에서 파일 복사를 수행하려면 `cp oldFile newFile` 명령을 사용한다.

다음은 JCL을 사용하여 OS/360에서 파일을 복사하는 예이다.

```jcl

//IS198CPY JOB (IS198T30500),'COPY JOB',CLASS=L,MSGCLASS=X

//COPY01 EXEC PGM=IEBGENER

//SYSPRINT DD SYSOUT=*

//SYSUT1 DD DSN=OLDFILE,DISP=SHR

//SYSUT2 DD DSN=NEWFILE,

// DISP=(NEW,CATLG,DELETE),

// SPACE=(CYL,(40,5),RLSE),

// DCB=(LRECL=115,BLKSIZE=1150)

//SYSIN DD DUMMY

```

JCL 복잡성에 대한 또 다른 설명은 PC 또는 유닉스와 유사한 환경에서 작업 실행에 대한 기대치가 다르다는 것이다.

  • 저가형 System/360 CPU는 MS-DOS가 설계된 1980년대 중반의 PC보다 성능이 떨어지고 가격이 비쌌다. OS/360은 최소 32KB 메모리 크기를 가진 시스템을 위해, DOS/360은 최소 16KB 시스템을 위해 설계되었다. 360/30 CPU는 1964년에 System/360이 발표되었을 때 저가형이었으며, 초당 1.8K~34.5K 개의 명령을 처리했다.[15] 1981년의 최초의 IBM PC는 16KB 또는 64KB 메모리를 가지고 있었으며 초당 약 330K 개의 명령을 처리했다.[16][17] 결과적으로 JCL은 "컴퓨터"가 처리하기 쉬워야 했고, 프로그래머의 사용 편의성은 우선순위가 훨씬 낮았다. 이 시대에는 프로그래머가 컴퓨터보다 훨씬 저렴했다.
  • JCL은 일괄 처리를 위해 설계되었다. 따라서 운영 체제에 각 단계의 결과에 따라 수행할 작업을 포함하여 모든 것을 알려야 한다. 예를 들어, `DISP=(NEW,CATLG,DELETE)`는 "프로그램이 성공적으로 실행되면 새 파일을 만들고 카탈로그화하고, 그렇지 않으면 새 파일을 삭제한다"는 의미이다. PC에서 실행되는 프로그램은 종종 처리 문제 이후의 정리 작업을 사용자에게 의존한다.
  • System/360 머신은 조직의 모든 사용자가 공유하도록 설계되었다. 따라서 `JOB` 카드는 운영 체제에 사용자의 계정에 청구하는 방법(IS198T30500), 할당될 수 있는 미리 정의된 스토리지 및 기타 리소스의 양(CLASS=L) 및 몇 가지 다른 사항을 알려준다. `//SYSPRINT DD SYSOUT=*`는 컴퓨터에게 일반 용지가 로드된 기본 프린터에 프로그램의 보고서를 인쇄하도록 지시하며, 빈 수표가 로드된 다른 프린터가 아니다. `DISP=SHR`는 운영 체제에 다른 프로그램이 `OLDFILE`을 동시에 읽을 수 있도록 알려준다.


DOS/360 및 OS/360 운영 체제의 후속 버전은 원래 JCL의 대부분의 기능을 유지한다. 고객이 모든 JCL 파일을 다시 작성하도록 강요하지 않기 위해 약간의 단순화가 이루어졌다. 많은 사용자는 한두 번 이상 사용될 가능성이 있는 JCL 문장의 집합을 ''프로시저''로 저장한다.[18]

OS JCL의 구문은 System/360 매크로의 구문과 유사하며, 따라서 많은 프로그램이 어셈블리 언어로 코딩되었던 시대의 프로그래머에게 친숙했을 것이다.

작업 제어 언어(JCL)는 메인프레임의 작업 관리 시스템 (작업 입력 서브 시스템)에 대해 배치 처리나 상주 프로세스 기동 시 지정을 하는 스크립트 언어이다.

일반적으로 작업명, 작업의 실행 클래스(우선 순위 등), 스텝명, 사용하는 프로그램명, 해당 프로그램이 저장되어 있는 라이브러리, 사용하는 가상 메모리의 용량, 사용하는 물리 파일명(데이터 세트명)과 그 속성(저장 위치, 신규 작성의 경우 용량 등), 그리고 작업 내(스텝 간) 제어를 수행한다. 또한 작업 간(작업 흐름, 작업 스트림)의 제어를 자동화하는 경우, JCL로는 할 수 없으므로 작업 스케줄러 등으로 수행한다.

대부분의 메인프레임에서는 프로그램에서 보이는 컴퓨터가 가상화되어 있고, 프로그램은 물리 파일명 등을 인식할 수 없으므로 (따라서 기술할 수도 없음), JCL에 의해서 비로소 프로그램 내의 논리 파일명과 실제 물리 파일명 등이 관련지어진다.

오픈 시스템에는 JCL과 동등한 기능이 없고 쉘 스크립트로 대체하는 경우가 많지만 원래는 전혀 다른 것이다. 메인프레임에서의 JCL은 필수적이며, 프로그래머 (프로그램)와 오퍼레이터 (운용 관리)를 분리하고 있다. 이 때문에 운용 관리 담당자는 각 프로그램의 사양을 알지 못하고, 각 작업이 어떤 물리 파일(데이터 세트)을 사용하는지 (사용하지 않는지)를 모두 파악하여 용이하게 변경할 수 있다. 또한 프로그램이 예기치 않은 물리 파일(데이터 세트)에 액세스하거나 생성하는 일이 없다.

JCL은 운영 체제(OS) 및 버전에 따라 기능 및 구문이 다르다. JCL을 가진 주요 OS에는 다음과 같은 것들이 있다.

  • MVS 계열
  • IBM의 MVS 계열(OS/360, OS/VS, MVS, MVS/XA, MVS/ESA, OS/390, z/OS)
  • 후지쯔MSP (MVS 호환 OS. JCL도 MVS 기반이지만 독자적인 확장 있음)
  • 히타치 제작소의 VOS3 (MVS 호환 OS. JCL도 MVS 기반이지만 독자적인 확장 있음)
  • VSE 계열
  • IBM의 VSE 계열 (DOS/VSE, VSE/ESA, z/VSE). '''JCS''' (Job Control Statement)라고 부르며, 기능 및 구문도 MVS 계열과는 다름)
  • 후지쯔의 XSP (기능 및 구문도 MSP와는 다름)
  • GCOS 계열 (다기능으로 일반 쉘 스크립트에 가까움)
  • 불의 GCOS
  • NEC의 ACOS
  • 유니시스의 OS2200 ('''EXEC 제어문''' (EXECutive 제어문)이라고 부르므로, 엄밀히는 '''ECL'''(Executive Control Language)이라고 칭하지만, JCL이라는 호칭이 일반화되어 있음)
  • 유니시스MCP


또한 메인프레임 전용 OS에서도, 대화형 지향적인 IBM z/VM 등에는 JCL이 존재하지 않는다 (게스트 OS의 각 사용자가 REXX 등의 스크립트 언어를 사용하여 자동화할 수 있지만, 필수적이지 않으며 UNIX 등에 가까움). 또한 메인프레임에서 UNIX나 Linux 등을 가동시키는 경우도, 물론 JCL은 존재하지 않는다.

4. 1. JCL 문 코딩 규칙

OS JCL 문은 식별자, 이름, 연산, 매개변수, 주석 필드로 구성되며, 각 필드는 정해진 규칙에 따라 작성해야 한다.[21]

각 JCL 문은 다음의 5가지 필드로 구성된다.

필드설명코딩 규칙
식별자 필드 (Identifier-Field)데이터가 아닌 JCL 문임을 시스템에 지시.
이름 필드 (Name-Field)다른 문들과 시스템이 이를 가리킬 수 있도록 특정 문을 식별.
연산 필드 (Operation-Field)문의 종류(명령문의 경우 명령)를 지정.
매개변수 필드 (Parameter-Field)오퍼렌드 필드(operand field)라고도 하며, 변수는 쉼표로 구별한다.
주석 필드 (Comments-Field)제어문을 코딩하는 동안 유용한 정보를 포함한다.



JCL 문은 한 줄에 71자까지만 사용할 수 있다.[41] 71자를 초과하는 경우, 다음 줄에 이어서 작성할 수 있다.


  • 문법에 쉼표(",")가 필요한 위치의 끝을 제외하고 실제 모든 JCL 카드를 끝맺는다.
  • 각각의 연속 카드를 "//"로 시작하되 적어도 하나의 공간을 남긴다.

4. 2. 키워드 매개변수

OS JCL의 모든 주요 매개변수는 키워드로 식별되며 어떠한 순서로도 표현할 수 있다.[22] 이 중 일부는 `SPACE`(새 파일에 할당할 디스크 공간의 양)와 `DCB`(파일 레이아웃의 상세 사양)와 같이 둘 이상의 하부 매개변수를 포함할 수 있다. 하부 매개변수는 `SPACE`처럼 위치 기반인 경우도 있지만, `DCB`와 같이 가장 복잡한 매개변수는 키워드 하부 매개변수를 갖는다.

위치 매개변수는 키워드 매개변수보다 먼저 와야 한다. 키워드 매개변수는 항상 등호(`=`)를 사용하여 키워드에 값을 할당한다.[22]

4. 3. 장치 독립성

OS 계열 운영 체제의 JCL은 처음부터 높은 수준의 장치 독립성을 제공했다. 작업을 마친 뒤 유지해야 할 새로운 파일에 대해서도 `UNIT=DISK`, `UNIT=TAPE`, `UNIT=SYSSQ`(테이프 또는 디스크)와 같이 일반적인 용어로 장치 유형을 지정할 수 있었다.[25] 물론, 필요하다면 모델 번호나 특정 장치 주소 또한 지정할 수 있었다.[25]

4. 4. 매개변수화된 프로시저

OS JCL 프로시저는 처음부터 매개변수화되어 매크로나 간단한 서브루틴과 매우 유사하게 되어 다양한 상황에서 재사용성을 높였다.[27]

```jcl

//MYPROC PROC FNAME=MYFILE01,SPTYPE=TRK,SPINIT=50,SPEXT=10,LR=100,BLK=1000

.....

//NEWFILE DD DSN=&FNAME,UNIT=DISK,SPACE=(&SPTYPE,&SPINIT,&SPEXT),

// DCB=(LRECL=&LR,BLKSIZE=&BLK),DISP=(NEW,CATLG,DELETE)

....

```

이 예제에서 앰퍼샌드("&")로 시작하는 모든 값들은 작업이 해당 프로시저를 사용하도록 요청할 때 지정될 매개변수이다. PROC 문은 프로시저에 이름을 부여하는 것 외에도 프로그래머가 각 매개변수에 대한 기본값을 지정할 수 있도록 한다. 따라서 이 예제에서는 하나의 프로시저를 사용하여 크기와 레이아웃이 다른 다양한 새 파일을 만들 수 있다. 예를 들면 다음과 같다.

```jcl

//JOB01 JOB ..........

//STEP01 EXEC MYPROC FNAME=JOESFILE,SPTYPE=CYL,SPINIT=10,SPEXT=2,LR=100,BLK=2000

```

또는

```jcl

//JOB02 JOB ..........

//STEP01 EXEC MYPROC FNAME=SUESFILE,SPTYPE=TRK,SPINIT=500,SPEXT=100,LR=100,BLK=5000

4. 5. 오버라이드 기능

JCL은 프로그램에 포함된 파일 구조 사양의 일부를 오버라이드할 수 있게 한다. 이 기능은 주로 새로운 파일을 만드는 데 사용된다. 예를 들어, 다음과 같이 JCL을 작성할 수 있다.[19]



//STEP01 EXEC PGM=MYPROG

//NEWFILE DD DSN=MYFILE01,UNIT=DISK,SPACE=(TRK,50,10),DCB=BLKSIZE=1000,

// DISP=(NEW,CATLG,DELETE)



위 JCL에서 `MYPROG` 프로그램 내의 코드가 블록 크기를 지정하더라도, `NEWFILE`은 1000 바이트의 블록 크기를 갖게 된다. 따라서 `MYPROG` 프로그램을 변경할 필요가 없다. 한편, 이 예제에서는 `DCB`의 하부 매개변수 `LRECL` (레코드 길이)를 지정하지 않았으므로, 레코드 길이는 `MYPROG`이 제시하는 대로 결정된다.[19]

4. 6. 재조회

다중 스텝 잡에서, 나중의 스텝은 이전 스텝에서 이미 정의된 파일을 다시 지정할 필요 없이 재사용할 수 있다. 이를 "참조"라고 한다.[19]

예를 들어, 다음과 같은 JCL 프로시저가 있다고 가정해 보자.

```jcl

//MYPROC ................

//MYPR01 EXEC PGM=..........

//NEWFILE DD DSN=&MYFILE,UNIT=DISK,SPACE=(TRK,50,10),

// DCB=(LRECL=100,BLKSIZE=1000),DISP=(NEW,CATLG,DELETE)

....

//MYPR02 EXEC PGM=..........

//INPUT01 DD DSN=*.MYPR01.NEWFILE

```

여기서 `MYPR02` 스텝의 `INPUT01` DD 문은 `MYPR01` 스텝에서 `NEWFILE`로 정의된 파일을 사용한다. `DSN=*.MYPR01.NEWFILE`는 "MYPR01 스텝의 NEWFILE 데이터셋을 사용하라"는 의미이다.[28]

작업별 JCL과 프로시저 호출이 섞인 작업에서도, 작업별 스텝은 프로시저 내에서 정의된 파일을 참조할 수 있다. 예를 들면 다음과 같다.

```jcl

//MYJOB JOB ..........

//STEP01 EXEC MYPROC Using a procedure

//STEP02 EXEC PGM=......... Step which is specific to this job

//INPUT01 DD DSN=*.STEP01.MYPR01.NEWFILE

```

이 예제에서 `DSN=*.STEP01.MYPR01.NEWFILE`는 "이 작업(MYJOB)의 STEP01 단계에서 사용된 프로시저(MYPROC)의 MYPR01 단계에 있는 NEWFILE로 식별된 파일을 사용하라"는 의미이다.

프로시저를 호출한 스텝의 이름을 사용(위 예시의 `STEP01`)함으로써, 프로그래머는 같은 작업 내에서 동일한 프로시저를 여러 번 사용하더라도 어떤 프로시저 인스턴스가 참조되는지 혼동하지 않을 수 있다.

4. 7. 입력 파일들의 연결

OS JCL은 프로그래머들이 입력 파일들을 하나로 연결시킬 수 있게 하여, 이들이 마치 하나의 파일처럼 보이게 만들어준다.[19] 예를 들면 다음과 같다.

```jcl

//INPUT01 DD DSN=MYFILE01,DISP=SHR

// DD DSN=JOESFILE,DISP=SHR

// DD DSN=SUESFILE,DISP=SHR

```

위에서 2번째, 3번째 문장들은 이름 필드에 값이 없으므로 OS는 이들을 "연결"(concatenation)로 취급한다.[19] 파일들은 동일한 기본 형태(거의 언제나 연속적인)여야 하며 같은 레코드 길이여야 한다. 그러나 블록 길이는 동일할 필요가 없다.

초기 버전의 OS (확실히 OS/360 R21.8 이전)에서는 블록 길이가 감소하는 순서여야 하거나, 사용자는 각 인스턴스를 검사하고, 명명된 DD 문에 발견된 최대 블록 길이를 추가해야 했다. 예를 들면 다음과 같다.

```jcl

//INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=800

// DD DSN=JOESFILE,DISP=SHR (BLKSIZE는 800 이하로 가정)

// DD DSN=SUESFILE,DISP=SHR (BLKSIZE는 800 이하로 가정)

```

OS의 이후 버전(확실히 적절한 "선택 가능한 단위"가 있는 OS/MVS R3.7 이후)에서는 할당 중에 OS 자체가 연결의 각 인스턴스를 검사하여 발견된 최대 블록 길이로 대체한다.

일반적인 대체 방법은 장치에서 가능한 최대 블록 길이를 결정하고 명명된 DD 문에 지정하는 것이었다. 예를 들면 다음과 같다.

```jcl

//INPUT01 DD DSN=MYFILE01,DISP=SHR,BLKSIZE=8000

// DD DSN=JOESFILE,DISP=SHR (BLKSIZE는 8000 이하로 가정)

// DD DSN=SUESFILE,DISP=SHR (BLKSIZE는 8000 이하로 가정)

```

이 대체 방법의 목적은 액세스 방식이 지정된 모든 데이터 세트를 수용할 수 있을 만큼 충분히 큰 입력 버퍼 세트를 할당하도록 하는 것이었다.

4. 8. 조건 처리

OS JCL은 반환 코드(Return Code)를 기반으로 조건부 처리를 지원한다. `COND` 매개변수를 사용하여 특정 조건에서 스텝 실행 여부를 결정할 수 있다.[35]

OS JCL은 반환 코드를 `COND` ("조건 코드")로 지칭하며, 이를 이용하여 후속 단계를 실행할지 여부를 결정한다. 그러나 대부분의 최신 프로그래밍 언어와 달리 OS JCL의 조건부 단계는 지정된 조건이 참인 경우 ''실행되지 않는다''.[35]

```text

//MYJOB JOB ...........

//STEP01 EXEC PGM=PROG01

....

//STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01)

....

//STEP03 EXEC PGM=PROG03,COND=(8,LE)

....

//STEP04 EXEC PGM=PROG04,COND=(ONLY,STEP01)

....

//STEP05 EXEC PGM=PROG05,COND=(EVEN,STEP03)

....

```

위 JCL은 다음의 의사코드로 변환할 수 있다.[35]

STEP01 실행

'''if''' STEP01의 반환 코드 '''가 4보다 크거나 같으면'''

STEP02 실행

'''end if'''

'''if''' 이전 반환 코드 '''가 8보다 작으면'''

STEP03 실행

'''end if'''

'''if''' STEP01이 비정상적으로 종료되면

STEP04 실행

'''end if'''

'''if''' STEP03이 비정상적으로 종료되면

STEP05 실행

'''else'''

STEP05 실행

'''end if'''

`COND` 문이 포함된 단계를 역순으로 읽으면 비교적 쉽게 이해할 수 있다. 이는 논리적 전치의 한 예이다.[35]

IBM은 나중에 JCL에 IF 조건을 도입하여 프로그래머가 코딩을 다소 쉽게 만들었다.[35]

```text

//TESTCOND IF (RC = 8 | RC = 10) THEN



//ELSECOND ELSE



//ENDCOND ENDIF

// IF $RC 또는 $MRC ...

// GOTO 레이블

```

단계의 반환 코드 검사 및 제어. 실행된 단계의 반환 코드에 따라 후속 단계를 건너뛰는 등의 처리를 할 수 있다. MVS 계열의 COND 매개변수에 해당한다.

4. 9. JCL 유틸리티

JCL은 데이터 처리를 위해 다양한 IBM 유틸리티 프로그램을 제공한다.[19] 유틸리티들은 일괄 처리에 가장 유용하며, 다음 세 그룹으로 나뉜다.

  • 데이터셋 유틸리티: 데이터셋의 작성, 인쇄, 복사, 이동, 삭제를 수행한다.
  • 시스템 유틸리티: 카탈로그 및 기타 시스템 정보를 유지 관리한다.
  • 접근 방식 서비스(Access Method Services): VSAM 및 비 VSAM 데이터셋을 처리한다.

5. 작업 엔트리 제어 언어 (JECL)

JECL은 z/OS 및 z/VSE와 같은 운영 체제에서 작업 엔트리 서브시스템(JES)에 대한 정보를 제공하는 데 사용되는 명령어 언어다. JECL은 작업 제어 언어(JCL)와는 구별되며, 작업을 실행할 네트워크 컴퓨터, 실행 시기, 출력물 대상을 지정하는 데 사용된다.[35]

z/OS에서 사용되는 JES2 JECL 구문은 다음과 같다.[37]

JECL 구문기능예시
/*$command오퍼레이터(콘솔) 명령어를 입력한다./*$S PRINTER3[38]
/*JOBPARM작업 관련 매개변수 값을 지정한다./*JOBPARM TIME=10
/*MESSAGE오퍼레이터 콘솔에 메시지를 보낸다./*MESSAGE CALL JOE AT HOME IF JOB ABENDS
/*NETACCT네트워크 작업의 계정 번호를 지정한다./*NETACCT 12345
/*NOTIFY알림 메시지의 대상을 지정한다./*NOTIFY SAM
/*OUTPUTSYSOUT 데이터 세트 옵션을 지정한다./*OUTPUT FORMS=BILL
/*PRIORITY작업 선택 우선 순위를 설정한다./*PRIORITY 15
/*ROUTE출력 대상 또는 실행 노드를 지정한다./*ROUTE PRT RMT5
/*SETUP볼륨 마운트 또는 기타 오프라인 작업을 요청한다./*SETUP TAPE01,TAPE02
/*SIGNOFF원격 세션을 종료한다./*SIGNOFF
/*SIGNON원격 세션을 시작한다./*SIGNON REMOTE5 password
/*XEQ실행 노드를 지정한다./*XEQ DENVER
/*XMIT다른 네트워크 노드로 전송할 작업 또는 데이터 세트를 나타낸다./*XMIT NYC



z/OS에서 사용되는 JES3 JECL 명령문은 다음과 같다.[39]

JECL 명령문기능예시
//**commandJES3 오퍼레이터(콘솔) 명령어를 입력한다.
//*DATASET인스트림 데이터 세트의 시작을 표시한다.
//*ENDDATASET인스트림 데이터 세트의 끝을 표시한다.
//*ENDPROCESS일련의 //*PROCESS 명령문의 끝을 표시한다.
//*FORMATSYSOUT 데이터 세트 옵션을 지정한다.
//*MAIN작업 관련 매개변수의 값을 지정한다.
//*NETJES3 종속 작업 제어를 사용하여 작업 간의 관계를 식별한다.
//*NETACCT네트워크 작업에 대한 계정 번호를 지정한다.
//*OPERATOR오퍼레이터 콘솔에 메시지를 보낸다.
//*PAUSE입력 리더를 중지한다.
//*PROCESS비표준 작업을 식별한다.
//*ROUTE작업의 실행 노드를 지정한다.
/*SIGNOFF원격 세션을 종료한다./*SIGNOFF
/*SIGNON원격 세션을 시작한다.



VSE JECL 문은 '* $$'로 시작한다(단일 공백에 유의). 작업 엔트리 제어 언어는 JCL 작업의 시작 및 종료 행을 정의한다. 이는 VSE/POWER에 이 작업이 어떻게 처리되는지 알려준다. JECL 문은 작업 이름(VSE/POWER에서 사용), 작업이 처리되는 클래스, 작업의 처리 방식(예: D, L, K, H)을 정의한다.

JECL 문[40]기능예시
* $ CTL기본 입력 클래스를 설정한다.* $ CTL CLASS=A
* $ JOB작업의 속성을 지정한다.* $ JOB JNM=PYRL,PRI=9
* $ EOJ작업의 끝을 표시한다.* $ EOJ
* $ RDR3540 디스켓에서 입력 스트림으로 파일을 삽입한다.* $ RDR SYS005,fname,2
* $ PRT스풀된 인쇄 파일의 특성을 지정한다. "LST"는 "PRT"의 동의어이다.* $ PRT FNO=STD,COPY=2
* $ PUN스풀된 펀치 파일의 특성을 지정한다.* $ PUN DISP=T,TADDR=280
* $ SLI소스 문장 라이브러리에서 데이터를 ("book") 입력 스트림에 삽입한다.* $ SLI A.JCL1
* $ DATA소스 문장 라이브러리에서 검색된 book에 카드 판독기에서 데이터를 삽입한다.* $ DATA INPUT1


6. MVS 계열의 JCL

MVS 계열의 JCL은 IBMOS/360, OS/VS, MVS, z/OS 등에서 사용되는 작업 제어 언어(JCL)이다. z/OS에서도 호환성을 유지하며, 1960년대부터 기본 문법이 크게 변경되지 않아 OS/360에서 실행되던 JCL이 z/OS에서도 동일하게 실행될 정도로 호환성이 좋다.[10]

초기 OS 계열의 JCL은 최대 z/OS를 포함하여 더 유연하고 사용하기 쉬워졌다. 1964년 시스템/360이 등장하자마자 제공되는 오래된 스타일의 문법을 사용했으나 이 오래된 문법은 20년 넘도록 여전히 동일하며 약간의 변경 사항만 있었다.

JCL과 함께 사용되는 특정 단어나 구문은 IBM 메인프레임 기술과 관련이 있다.[4][5]


  • 데이터 세트: "데이터 세트"는 파일을 의미한다. 임시 또는 영구적일 수 있으며 디스크 드라이브, 테이프 스토리지 또는 기타 장치에 위치할 수 있다.
  • 멤버: 분할 데이터 세트(PDS)의 "멤버"는 PDS 내의 개별 데이터 세트를 의미한다. 예를 들어 SYS1.MACLIB(GETMAIN)과 같이 참조할 수 있다.[6]
  • 분할 데이터 세트: "분할 데이터 세트"(PDS)는 멤버 또는 아카이브의 모음이다. 소스 코드, 어셈블러 매크로(SYS1.MACLIB), 시스템 구성(SYS1.PARMLIB) 등과 같은 텍스트 데이터를 저장하는 데 일반적으로 사용된다.[6]
  • USS: 유닉스 시스템 서비스는 MVS 기본 제어 프로그램의 일부로 실행되는 완전한 유닉스 환경이다.


JCL은 다음 세 가지 기본 문장 유형으로 구성된다.[19]

  • `JOB` 문: 작업의 시작을 식별하며, 청구, 실행 우선 순위, 시간 및 공간 제한과 같은 전체 작업에 대한 정보를 제공한다.
  • `EXEC` 문: 작업의 이 단계에서 실행될 프로그램 또는 ''프로시저''를 식별하며, 단계 실행 또는 건너뛰기 위한 ''COND''ition을 포함한 단계에 대한 정보를 제공한다.[20]
  • `DD` (데이터 정의) 문: 단계에서 사용할 데이터 파일을 식별하고 해당 파일에 대한 자세한 정보를 제공한다. `DD` 문은 단계 내에서 어떤 순서로든 올 수 있다.


JCL 파일은 길고 복잡할 수 있으며, 언어 자체도 읽기 쉽지 않기 때문에 OS JCL은 프로그래머가 JCL 문장과 같은 줄에 표시 또는 확장하거나 주석만 포함하는 줄을 사용해서 두 가지 유형의 설명을 포함할 수 있도록 허용한다.

DOS와 OS JCL은 최대 80자 길이의 라인을 사용할 수 있는데, 이는 DOS/360 및 OS/360이 처음 사용되었을 때 컴퓨터 시스템에 새로운 입력을 제공하는 주요 방법이 80열 천공 카드였기 때문이다.[10]

프레드 브룩스는 JCL이 생성된 OS/360 프로젝트를 감독했으며, 디자인의 설계에서 JCL을 "최악의 컴퓨터 프로그래밍 언어"라고 불렀다.[14]

6. 1. 문법

MVS JCL 문은 80바이트 길이로 구성되며, 여러 개의 문으로 하나의 JCL을 구성한다. JCL 문은 식별자, 이름, 오퍼레이션, 매개변수/오퍼랜드, 코멘트 필드로 구성된다.

각 JCL 문은 5개의 필드로 나뉜다.

Identifier-FieldName-FieldOperation-FieldParameter-FieldComments-Field
공백 없음spacespacespace


  • 식별자 필드(Identifier-Field): 데이터가 아닌 JCL 문인 시스템을 지시한다. 식별자 필드는 다음을 이룬다.
  • * 구분문(delimiter statement)을 제외한 모든 JCL 문의 열 1과 열 2는 //를 포함한다.
  • * 구분문에 해당하는 열 1과 열 2는 /*를 포함한다.
  • * JCL 주석문에 속하는 열 1, 2, 3은 //*를 포함한다.
  • 이름 필드(Name-Field): 다른 문들과 시스템이 이를 가리킬 수 있도록 특정한 문을 식별한다. JCL 문의 경우 이름은 다음과 같이 코딩되어야 한다.
  • * 이름은 열 3에서 시작해야 한다.
  • * 이름은 1부터 8까지의 알파벳/숫자 또는 국가성 ($, #, @) 문자여야 한다.
  • * 첫 문자는 알파벳이어야 한다.
  • * 이름 뒤에는 적어도 하나의 공백이 있어야 한다.
  • 연산 필드(Operation-Field): 문의 종류(명령문의 경우 명령)를 지정한다. 연산 필드는 다음과 같이 코딩되어야 한다.
  • * 연산 필드는 문의 문법 상자에서 글자로 이루어진다.
  • * 연산 필드 앞에 이름 필드가 온다.
  • * 연산 필드 앞뒤로 적어도 하나의 공백이 있어야 한다.

연산 필드는 JOB/EXEC/DD를 말한다.

  • * JOB - JOB 문
  • * EXEC - EXEC 문
  • * DD - DD 문
  • 매개변수 필드(Parameter-Field): 오퍼렌드 필드(operand field)라고도 하며 변수는 쉼표로 구별한다. 다음과 같이 코딩되어야 한다.
  • * 매개변수 필드는 연산자 필드 뒤에 온다.
  • * 매개변수 필드는 몇 가지 정보를 제공하기 위해 JCL 문으로 코딩된 "키워드"인 매개변수를 포함한다. 예) 프로그램_이름,데이터셋_이름,...
  • 주석 필드(Comments-Field): 제어문을 코딩하는 동안 유용한 정보를 포함한다.
  • IBM 메인프레임 기술 관련 용어[4][5]
  • * 데이터 세트: "데이터 세트"는 파일이다.
  • * 멤버: 분할 데이터 세트(PDS)의 "멤버"는 PDS 내의 개별 데이터 세트이다.[6]
  • * 분할 데이터 세트: "분할 데이터 세트" 또는 PDS는 멤버 또는 아카이브의 모음이다.[6]
  • * USS: 유닉스 시스템 서비스는 MVS 기본 제어 프로그램의 일부로 실행되는 완전한 유닉스 환경이다.


JCL(작업 제어 언어) 스테이트먼트의 한 줄 길이는 80 바이트이며, 한 줄 이상의 스테이트먼트로 하나의 JCL이 구성된다.

JCL 스테이트먼트는 1열부터 71열까지 사용한다(주석 제외). 73열부터 80열에는 종종 시퀀스 번호가 기록된다.

71자를 초과하여 하나의 스테이트먼트를 기술하는 경우에는(주석 제외), 앞 줄의 마지막은 쉼표로 끝나며, 다음 줄은 4열부터 16열 사이에서 시작한다(물론, 모든 줄의 처음 2 문자는 "//"이다).

JCL은 1열부터 2열의 "//"로 시작한다. 다음은 예외이다.

  • "/*" 또는 사용자 정의 다른 구분자
  • "//*"는 해당 행 전체가 주석임을 나타낸다.


이름 필드는 하나의 명령문이다. 따라서 다른 명령문이 해당 명령문을 지시하거나 언급할 수 있다. 3번째 열부터 시작하며, 8자 이하여야 한다. 알파벳과 숫자, "#"나 "@" 또는 "$"와 같은 문자를 사용할 수 있다. 이름의 시작은 숫자로 시작할 수 없다. 작업명, 단계명, 프로시저명, DD명을 기술한다.

오퍼레이션 필드는 실행해야 할 명령, 오퍼레이션("JOB", "EXEC", "DD" 등)을 기술한다. 최소한 1개의 공백이 앞에 와야 한다.

키워드 매개변수의 순서는 정해져 있지 않다. 매개변수와 매개변수 사이에는 공백을 두지 않는다. 공백 다음에는 주석이 온다. 행 내 매개변수 기술의 왼쪽, 매개변수 앞에는 가독성을 높이기 위한 공백이 들어간다.

JCL의 명령문 파라미터 필드 뒤에 인라인 코멘트를 기술할 경우에는, 최소 1자의 공백을 두어 명령문과 코멘트를 구분한다. 71번째 열을 초과하여 코멘트를 기술할 경우에는, 72번째 열을 공백으로 두지 않는다(통상, "X"가 사용된다). 다음 행은 "// " 뒤 1번째 열에서 3번째 열 사이부터 코멘트의 기술을 계속한다.

6. 2. 작업 (JOB)

하나의 작업(JOB)은 JOB 문으로 시작하고, 빈 행(//)으로 끝난다.[9] 작업은 여러 개의 스텝(STEP)으로 구성될 수 있다.[9]

6. 3. JOB 문

//'''jobname''' JOB (회계 정보),CLASS=x,MSGCLASS=x,REGION=nK,TIME=(m,s),NOTIFY=XXXXXX

CPU나 입출력 등, 컴퓨터 자원을 사용한 만큼의 사용료를 사용한 부서에 청구하기 위해 필요한 회계상의 정보가 괄호나 쿼테이션 마크로 구분되어 기술된다.

CLASS 파라미터는, 잡(Job)이 어떤 이니시에이터에서 실행될지를 결정한다. 그 외, 잡의 우선 순위를 지정하는 파라미터 등이 있다.

MSGCLASS 파라미터는 잡의 실행 결과를 어디에 출력할지를 지정한다. 출력 클래스는 개별 프린터나, 지정된 파일 등에 할당되어 있으며, 사용자는 희망하는 출력 대상을 지정한다.

REGION 파라미터는, 잡이 사용할 수 있는 가상 기억 장치의 최대량, 리전(Region)의 크기를 결정한다. 킬로(Kilo)나 메가(Mega)라는 단위를 사용하여 지정할 수 있다. 지정할 수 있는 크기는, 시스템을 구축할 때 잡 클래스별로 설정된다.

TIME 파라미터는, CPU를 사용할 수 있는 최대 시간을 결정한다. 분, 초 단위로 지정한다. 잡의 모든 스텝이 사용하는 시간을 지정한다. 사용할 수 있는 최대 시간은 1439분 59초 (TIME=(1439,59))이다. 1440분을 지정하면 시간 제한이 없다.[19]

6. 4. EXEC PGM 문

//step명 EXEC PGM=progname,PARM="parm",COND=condition,REGION=nK,TIME=(m,s)

progname은 실행할 프로그램을 지정한다. 프로그램이 시스템 표준 지정 링크 리스트, 라이브러리에 없는 경우, JOBLIB 또는 STEPLIB을 DD 스테이트먼트에 기술하여, 저장되어 있는 라이브러리를 지정한다.[19]

COND 파라미터는 조건을 만족하는 경우 해당 잡 스텝을 우회하거나, 실행하지 않도록 지정한다. 이 파라미터는 종종 조건을 만족하면 실행하는 IF 스테이트먼트와 혼동되어 혼란을 야기한다. 최근에 출시된 운영체제에서는 이 COND 지정의 기술 방식이 IF 지정의 기술 방식으로 대체되었다.[19]

6. 5. EXEC PROC 문

EXEC PROC 문은 미리 정의된 프로시저를 호출한다.[20][26] 프로시저는 JCL의 재사용성을 높여준다.

프로시저를 실행하는 방법은 다음과 같다.

```

//프로시저 단계명 EXEC PROC=프로시저명,param1=foo, ...

```

또는

```

//프로시저 단계명 EXEC 프로시저명,param1=foo, ...

```

  • 프로시저명: 카탈로그화되거나 인스트림(in-stream)된 프로시저명을 지정한다.
  • param1 이하: 프로시저에 정의된 심볼릭 키워드에 따라 값을 지정한다.


관례상, "PROC="는 생략하는 경우가 많다.[26]

프로시저는 JCL의 스켈레톤(skeleton)과 같다. 일반적으로 데이터 세트 이름을 대체할 수 있는 심볼을 포함하며, 프로시저가 사용될 때 실제 데이터 세트 이름으로 바뀐다. 이러한 특징은 JCL에서 매크로 기능을 사용할 수 있게 해준다.

MVS의 구 버전에서는 프로시저가 SYS1.PROCLIB에 미리 저장/카탈로그되어 있어야 했다(카탈로그식 프로시저, 카타프로). 새 버전에서는 사용자가 정의한 라이브러리에 저장된 프로시저도 사용할 수 있게 되었다.

일반적으로 프로시저는 proclib라고 불리는 프로시저 라이브러리에서 호출되어 실행된다. 하지만 실행하는 해당 잡 자체 내에 정의할 수도 있는데, 이를 인라인(in-stream) 프로시저라고 하며, 보통 proclib에 등록하기 전에 프로시저를 테스트할 때 사용된다.

인라인 프로시저의 구조는 다음과 같다.

  • 첫 번째 행은 반드시 PROC 문으로 시작하며, 프로시저 이름과 심볼릭의 초기값을 정의한다.
  • 예시: `//MYPROC PROC &LIB="MY.TEST.LIBRARY"`
  • 어떤 잡이 이 프로시저를 호출할 때, 다음과 같이 기술한다.
  • 예시 1: `//FIRST EXEC MYPROC` (심볼 LIB는 초기값 "MY.TEST.LIBRARY"로 치환)
  • 예시 2: `//SECOND EXEC MYPROC,LIB="FREDS.TEST.LIBRARY"` (심볼 LIB는 "FREDS.TEST.LIBRARY"로 치환)
  • 인라인 프로시저를 종료하는 문은 `// PEND` 이다.

6. 6. DD 문

DD 문은 데이터 세트를 정의하고, 데이터 세트 이름, 처리 방법, 장치, 볼륨, 공간 할당 등을 지정한다.[19]

DD문은 데이터를 참조하는데 사용된다. 이 문은 프로그램의 데이터 세트에 대한 내부 설명을 외부 장치(디스크, 테이프, 카드, 프린터 등)의 데이터에 연결한다. DD는 장치 유형(예: '181', '2400-5', 'TAPE'), 테이프 또는 디스크의 볼륨 일련 번호, 그리고 파일 식별에 사용되는 프로그램의 데이터 제어 블록(DCB) 이후 `DCB` 하위 매개변수라고 하는 데이터 파일에 대한 설명을 제공할 수 있다.[23]

파일을 설명하는 정보는 세 가지 소스에서 제공될 수 있다. DD 카드 정보, 테이프 또는 디스크에 저장된 기존 파일의 데이터 세트 레이블 정보, 프로그램에 코딩된 DCB 매크로이다. 파일이 열리면 이 데이터가 병합되며, DD 정보가 레이블 정보보다 우선하고, DCB 정보가 둘 다보다 우선한다. 그런 다음 업데이트된 설명이 데이터 세트 레이블에 다시 기록된다. 이는 잘못된 DCB 정보가 제공될 경우 의도하지 않은 결과를 초래할 수 있다.[23]

DD 문을 사용하면 인라인 데이터를 작업 스트림에 주입할 수 있다. 이는 IDCAMS, SORT 등과 같은 유틸리티에 제어 정보를 제공하고 프로그램에 입력 데이터를 제공하는 데 유용하다.

DD문의 형식은 다음과 같다.

```text

//ddname DD DSN=datasetname,DISP=disposition,UNIT=unit,VOL=SER=volser,SPACE=space,DSORG=dsorg,DCB=dcb

```

또는

```text

//ddname DD *

```

또는

```text

//ddname DD DATA,DLM=@@

```

또는

```text

//ddname DD SYSOUT=msgclass

```

  • `ddname`: 데이터 정의 이름.
  • `DSN`: 접근하거나 할당할 데이터 세트 이름을 지정한다. 해당 데이터 세트가 카탈로그되지 않은 경우 `UNIT` 매개변수와 `VOL` 매개변수가 추가로 필요하다. 구분 데이터 세트 내의 하나의 멤버를 참조, 지정, 또는 언급할 경우에는 괄호로 묶어 기술한다. (예: `MY.LIBRARY(MYPROGRM)`) 만약 데이터 세트 이름을 지정하지 않은 경우, 시스템은 하나의 데이터 세트를 할당한다. 이 데이터 세트는 해당 스텝 내에서만 유지되고 사용될 수 있다. 스텝을 넘어서 사용하지만, 작업이 종료되면 불필요한 임시 데이터 세트(템포러리 데이터 세트)를 지정할 때는 데이터 세트 이름의 앞에 "&&"를 기술한다. (예: `DSN=&&TEMPNAME`)
  • `DISP`: 데이터 세트를 거기에서 생성할 것인지, 이미 존재하는지, 작업이 정상 종료되었을 때 데이터 세트를 보존할 것인지 삭제할 것인지, 작업이 실패했을 때 데이터 세트를 보존할 것인지 삭제할 것인지를 지정한다. 이 `DISPOSITON` 매개변수는 괄호로 묶어 세 개의 서브 매개변수를 갖는다.
  • `DISP=(OLD,DELETE,KEEP)`: 데이터 세트는 기존 데이터 세트이며, 스텝이 성공하면 삭제되고, 실패하면 보존된다.
  • `DISP=SHR`: 데이터 세트는 기존 데이터 세트이며, 같은 타이밍, 시간에 다른 태스크가 읽으러 올 수 있다.
  • `DISP=(NEW,CATLG,DELETE)`: 데이터 세트를 새로 생성하고 카탈로그한다. 스텝이 실패하면 삭제되고 카탈로그에서 제거된다.
  • 아무것도 지정하지 않은 경우의 초기값은 `(NEW,DELETE)`이다.
  • `UNIT`과 `VOL`:
  • `UNIT=SYSDA`: 다이렉트 액세스 장치 전반을 의미한다. 템포러리 파일(임시 데이터 세트)에 대한 지정인 경우가 많다.
  • `UNIT=3390,VOL=SER=ABC123`: 특정(지정된) DASD의 팩 ABC123에 할당할 것을 지정한다.
  • `SPACE`: 블록, 트랙, 실린더 단위로, 1차 할당량과 2차 할당량을 지정한다. 그리고 구분 데이터 세트의 디렉토리 블록 크기를 지정한다.
  • `SPACE=(TRK,1)`: 1트랙만 할당한다. 2차 할당은 하지 않는다.
  • `SPACE=(CYL,(50,25))`: 먼저 50실린더 할당(1차 할당), 부족하면 25실린더를 15회까지 할당한다(2차 할당). (그럼에도 부족하면 용량 부족으로 작업이 비정상 종료된다)
  • `SPACE=(4096,(10000),ROUND,RLSE)`: 4096바이트의 블록이 10000블록 분이 되도록, 실린더 크기와 비슷한 값으로 할당한다. 사용하지 않는 남은 공간이 생기면, 작업 스텝이 종료되었을 때 빈 부분을 해제한다.
  • `DSORG`: 데이터 세트의 편성 방법을 지정한다. `PS`(물리 순차, 순차 데이터 세트) 또는 `DA`(다이렉트 액세스) 또는 `IS`(ISAM, 현재 지원되지 않음) 또는 `PO`(구분 데이터 세트)를 지정한다.
  • `DCB`: 프로그램이 데이터 컨트롤 블록을 통해 이 DD 스테이트먼트 앞으로 지정한 모든 서브 매개변수를 지정할 수 있다. 일반적으로, `RECFM` 서브 매개변수에 의해, 레코드 형식이 지정되는 경우가 많다. `FB`(블록화된 고정 길이), `U`(정의되지 않음), `V`(가변 길이) 등.
  • `DD *`: 거기에서부터 80바이트의 카드 이미지 데이터라는 지정이다. 이 데이터는, 1번째 열에서 2번째 열에 `/*`를 기술하거나, 다음 JCL 스테이트먼트(1번째 열에서 2번째 열이 `// `)의 기술이 시작되는 것으로 종료된다.
  • `DD DATA`: `DD *`와 같지만, JCL 스테이트먼트에 포함된다. 그것은, 1번째 열에서 2번째 열에 `@@`가 기술되는 행 또는 JCL의 종료로써 종료된다.
  • `DD SYSOUT=msgclass`: 프린트 출력을 지정한다. `SYSOUT=*`를 지정하면, 작업 카드에 지정한 `MSGCLASS`로 출력된다.


입력 데이터용 DD 스테이트먼트는 아래와 같이 연결하여 지정할 수 있다(콘카치).

```text

//STEPLIB DD DSN=MY.TEST.LIBRARY,DISP=SHR

// DD DSN=MY.TEAM.LIBRARY,DISP=SHR

// DD DSN=MY.LIVE.LIBRARY,DISP=SHR

6. 7. 프로시저 (Procedure)

프로시저는 JCL의 스켈레톤으로, 데이터 세트 이름 등을 대체할 수 있는 심볼릭 매개변수를 포함한다. 프로시저는 JCL에서 매크로 기능을 사용할 수 있게 한다.[27]

6. 8. 조건 처리

MVS JCL은 IF-THEN-ELSE-ENDIF 문을 사용하여 기본적인 조건 처리를 지원한다.[19] 다음은 그 예시이다.

```jcl

//TESTCOND IF (RC = 8 | RC = 10) THEN



//ELSECOND ELSE



//ENDCOND ENDIF

// IF $RC 또는 $MRC ...

// GOTO 레이블

```

실행된 단계의 반환 코드에 따라 후속 단계를 건너뛰는 등의 처리를 할 수 있다. MVS 계열의 COND 매개변수에 해당한다.

7. VSE 계열의 JCS

VSE 계열의 JCS(Job Control Statement)는 IBM의 z/VSE 등에서 사용되는 작업 제어 언어이다. JCS는 MVS 계열의 JCL과 기능은 거의 동일하지만, 구문은 상당히 다르다.[40] JCS는 배치 처리를 어떻게 실행할지, 서브시스템을 어떻게 기동시킬지를 작업 엔트리 시스템(VSE/POWER)에 지시한다.[40]

JCS는 아니지만, VSE/POWER에 대한 지시를 수행하는 명령어는 JECL(잡 입력 제어 언어)이며, MVS 계열의 JES 명령어에 해당한다. JECL 문은 '* $$*'로 시작하며(단일 공백에 유의), JCL 작업의 시작 및 종료 행을 정의한다. 이는 VSE/POWER에 이 작업이 어떻게 처리되는지 알려준다. JECL 문은 작업 이름(VSE/POWER에서 사용), 작업이 처리되는 클래스, 작업의 처리 방식을 정의한다.[40]

JECL 문[40]기능예시
`* $ CTL`기본 입력 클래스를 설정한다.`* $ CTL CLASS=A`
`* $ JOB`작업의 속성을 지정한다.`* $ JOB JNM=PYRL,PRI=9`
`* $ EOJ`작업의 끝을 표시한다.`* $ EOJ`
`* $ RDR`3540 디스켓에서 입력 스트림으로 파일을 삽입한다.`* $ RDR SYS005,fname,2`
`* $ PRT`스풀된 인쇄 파일의 특성을 지정한다. "LST"는 "PRT"의 동의어이다.`* $ PRT FNO=STD,COPY=2`
`* $ PUN`스풀된 펀치 파일의 특성을 지정한다.`* $ PUN DISP=T,TADDR=280`
`* $ SLI`소스 문장 라이브러리에서 데이터를 ("book") 입력 스트림에 삽입한다.`* $ SLI A.JCL1`
`* $ DATA`소스 문장 라이브러리에서 검색된 book에 카드 판독기에서 데이터를 삽입한다.`* $ DATA INPUT1`



```text


  • $$ JOB JNM=NAME,DISP=K,CLASS=2


[some JCL statements here]

  • $$ EOJ

7. 1. JOB 문

VSE JCS의 JOB 문은 작업의 시작을 나타낸다.[40] 작업의 속성을 지정하며, `* $$ JOB` 형식으로 사용된다.[40] 예를 들어 `* $$ JOB JNM=PYRL,PRI=9`는 작업 이름을 PYRL로, 우선순위를 9로 지정한다.

7. 2. EXEC PGM 문

// EXEC progname,SIZE=nn,PARM=parm

```

프로그램을 실행하며, 프로그램 실행에 필요한 기억 공간과 매개변수를 지정할 수 있다.[40]
예시:```

//EXEC PROGA,SIZE=xxx,PARM=ABCDE

7. 3. EXEC PROC 문

EXEC PROC 문은 미리 작성된 JCL인 프로시저를 실행하기 위해 사용된다.[40] 프로시저는 하나의 잡이나 서로 다른 잡에서 여러 번 사용되는 스텝을 반복하는 데 쓰여 프로그래머의 시간을 절약하고 오류의 위험을 줄인다.[40] 프로시저를 실행하려면 JCL 파일에 하나의 카드를 포함시키면 되는데, 이 카드는 프로시저를 특정 파일에서 복사하여 작업 흐름에 삽입한다.[40] 또한, 프로시저는 매개변수(parameter)를 포함하여 개별적인 사용에 맞게 맞춤식으로 정의할 수 있다.[40]

7. 4. ASSIGN 문

ASSIGN 문은 입출력 장치를 지정하고, 프로그램 내 논리 장치명과 물리 장치 주소를 연결한다.[40]

예시:

```text

//ASSGN SYS005,241

//ASSGN SYS010,DISK,VOL=VOL555

7. 5. DLBL/EXTENT 문

DLBL/EXTENT 문은 자기 디스크 장치 상의 파일을 연결한다.[40] 순차 파일의 경우에는 EXTENT도 필요하다.[40]

```jcl

// DLBL 파일명,'파일 ID'

// EXTENT 장치명,볼륨 일련 번호,,,시작 주소,용량

7. 6. LIBDEF 문

LIBDEF 문은 VSE의 라이브러리를 지정한다.[40]

7. 7. TLBL 문

TLBL 문은 표준 레이블이 있는 자기 테이프 사용 시 지정한다.[40]

```text

// TLBL 파일 이름, 파일 ID, 날짜, 파일 일련 번호, 볼륨 순서 번호, 파일 순서 번호

7. 8. UPSI 문

// UPSI xxxxxxxx

CPU의 외부 스위치를 시뮬레이션한다.[40]

7. 9. OPTION 문

OPTION 문은 컴파일러에 대한 출력 형태를 지시한다.[40]

7. 10. IF-GOTO 문

OS는 프로그램들이 성공 여부에 대한 반환 코드를 설정할 것이라고 예측한다. OS JCL은 반환 코드를 COND (조건 코드)로 지시하며, 이를 이용하여 차기 단계들의 실행 여부를 결정한다.[40]

```jcl

//STEP01 EXEC PGM=PROG01

....

//STEP02 EXEC PGM=PROG02,COND=(4,GT,STEP01)

....

```

위 코드는 숫자 4가 STEP01의 반환 코드보다 크면 STEP02를 실행하지 않도록 지시한다.

이처럼 뒤에 COND 문이 있는 스텝을 읽음으로써 이들을 매우 쉽게 이해할 수 있다. 그러나 나중에 IBM은 COND 매개변수를 유지하면서도 IF 조건문을 JCL에 도입하여 프로그래머들이 코딩을 쉽게 할 수 있게 하였다. (COND 변수를 사용하는 기존의 JCL에 대한 변경을 방지)

단계의 반환 코드 검사 및 제어는 실행된 단계의 반환 코드에 따라 후속 단계를 건너뛰는 등의 처리를 할 수 있게 한다. 이는 MVS 계열의 COND 매개변수에 해당한다.

7. 11. 종료 문

/&

작업의 종료를 나타낸다.[40]

8. XSP의 JCL

후지쯔 XSP의 JCL은 다음과 같은 형식을 가진다.

JCL 구문설명
`\ JOB JOB1234,ACCT=USER001,PRTY=(1,1),LIST=A`작업명(JOB1234), 계정(USER001), 우선순위(1,1), 리스트(A) 등을 지정한다.
`\STEP0001 EX PROG1234,COND=10`스텝명(STEP0001)과 실행할 프로그램(PROG1234), 조건(10) 등을 지정한다.
`\ FD PRGLIB=DA,FILE=SYSPRG`프로그램 라이브러리(SYSPRG)를 지정한다.
`\ FD CF=DA,FILE=TEST.FILEA`사용할 파일(TEST.FILEA)을 지정한다.
`\ FD SYSDBOUT=DA,VOL=VOL1,TRK=(2,1,RLSE),SOUT=A`출력 파일(SYSDBOUT)의 볼륨(VOL1), 트랙(2,1,RLSE), 출력 클래스(A) 등을 지정한다.



이는 JCL이 메인프레임에서 배치 처리를 위해 사용되는 스크립트 언어이기 때문이다.

9. GCOS의 JCL

JCL영어은 불의 GCOS에서 사용되는 작업 제어 언어이다. 다음은 GCOS JCL의 예시이다.


  • 예시 1

```

$ IDENT 00123,USER-01,DEBUG,TEST

$ OBJECT

.

. Object File

.

$ DKEND

$ EXECUTE ON3,DUMP

$ LIMITS 5,,,5000

```

  • 예시 2

```

$$j,talk

$$select(ident)

$ program progabc

$ limit ,24k

$ prmfl **,q,r,netex/adpl.x/exec/testabc

$ privity

참조

[1] 웹사이트 "Every job submitted for execution ... must include JCL statements" ibm.com
[2] 문서 and many more complex details, such as whether the file is to be retained or deleted, the maximum disk space to which it can grow, the name of a tape to be pre-mounted
[3] 서적 Job Control Language
[4] 서적 Job Control Language
[5] 서적 System/360–370 Assembler Language
[6] 서적 System/360–370 Assembler Language
[7] 웹사이트 What We've Done for You Lately With PDSE https://share.confex[...] SHARE in Orlando 2023-03-03
[8] 서적 System/360–370 Assembler Language
[9] 서적 System/360–370 Assembler Language
[10] 서적 Structured COBOL Programming
[11] 서적 Structured COBOL Programming
[12] 서적 Structured COBOL Programming
[13] 웹사이트 modeled on https://www.ibm.com/support/knowledgecenter/SSLTBW_2.2.0/com.ibm.zos.v2r2.hasc300/has2z1_Submitting_to_the_internal_reader_from_jobs_or_tasks.htm, using knowledge dating back to when Green Cards came from IBM, and Manix worked for a company owning an IBM card sorter
[14] 서적 The Design Of Design Addison-Wesley 2010
[15] 웹사이트 IBM Archives: System/360 Model 30 https://web.archive.[...] 2016-04-25
[16] 웹사이트 IBM PC https://web.archive.[...] 2007-10-21
[17] 웹사이트 IBM-compatible computers History of PCs http://www3.iath.vir[...] 2007-08-14
[18] 서적 zOS JCL https://books.google[...] John Wiley & Sons 2002
[19] 서적 Job Control Language
[20] 문서 A pre-stored set of "EXEC PGM=" and "DD" JCL commands which could be parameterized
[21] 서적 Job Control Language
[22] 서적 Job Control Language
[23] 서적 OS/VS MVS Data Management Services Guide http://www.prycroft6[...] 2014-10-17
[24] 서적 IBM System/360 Operating System: Job Control Language Reference http://www.bitsavers[...] 2019-06-25
[25] 서적 System/360–370 Assembler Language
[26] 문서 the default for the EXEC statement is PROC=
[27] 서적 Job Control Language
[28] 웹사이트 Data set names https://www.ibm.com/[...] 2014-03-27
[29] 웹사이트 Relationship of the COND parameters on JOB and EXEC statements https://www.ibm.com/[...] 2018-02-21
[30] 서적 NetView: IBM's Network Management Product Van Nostrand Reinhold 1993
[31] 웹사이트 Newly unemployed New Yorkers are being frustrated by 1970s-era technology(nytimes.com) https://hn.matthewbl[...] 2020-05-07
[32] 서적 Job Control Language
[33] 서적 Introduction to FORTRAN IV Programming: Using the WATFOR/WATFIV Compilers Goodyear Publishing Company 1971
[34] 서적 System/360–370 Assembler Language
[35] 서적 zOS JCL https://books.google[...] John Wiley & Sons 2014-05-05
[36] 서적 IBM System/360 Operating System Remote Job Entry http://bitsavers.inf[...] 2014-05-05
[37] 웹사이트 Job Entry Subsystem 2 (JES2) Control Statements http://publibz.bould[...] 2013-02-25
[38] 문서 other examples can be viewed at [[Houston Automatic Spooling Priority#Operator Commands]]
[39] 웹사이트 Job Entry Subsystem 3 (JES3) Control Statements http://publibz.bould[...] 2013-02-25
[40] 서적 DOS/VS POWER/VS Installation and Operations http://bitsavers.tra[...]
[41] 링크 CPU MIPS ratings http://listserv.uark[...]
[42] 웹인용 IBM PC http://www.vintage-c[...] 2014-03-10
[43] 웹사이트 IBM-compatible computers http://www3.iath.vir[...] 2007-08-14
[44] 서적 zOS JCL http://books.google.[...] John Wiley & Sons, 2014-05-05



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com